(function($, doc){    
    /**
     * 解析语言表达式, eg:lan('res.manage.appearance.savedInfo') 
     * 本函数假设语言包存在于全局变量lans中.
     * @param {String} lanKey
     * @return {String}
     */
    var lan = function(lanKey, params){
    	//lans需要前置window引用，避免当语言包加载失败时产生语法错误.
        var text = JSON.getByPath(window.lans, lanKey); 
        return !Type.isUndefined(text) ? ( !Type.isUndefined(params) ? text.format(params) : text ) : lanKey;
    };
    
    /**
     * 解析html中的语言绑定表达式. 
     * @param {HtmlElement|JQuery} context
     */
    lan.parse = function(context){
        if(Type.isUndefined(context)){
            context = doc.body;
        }
        //<div lan="common.lbl.name"></div>
        $('[lan]', context).each(function() {
            var $ele = $(this),
                tagName = $ele.get(0).tagName.toLowerCase(), 
                lanExp = $ele.attr('lan'),
                lanExpParts = lanExp.split(','),
                value = lan(lanExpParts[0]),
                attr = lanExpParts[1];

            if(!Type.isUndefined(value)) {
                if(Type.isString(attr)){
                    $ele.attr(attr, value);    
                } else {
                    switch(tagName) {                        
                        case 'input':
                        case 'textarea':
                            $ele.val(value);
                            break;
                        default :
                            $ele.html(value);
                            break;
                    }
                }
            }
        });        
        //lana="error-text-custom$res.formHelp.diffPwd"
        //lana="error-text-minlen$res.formHelp.shortPwd$error-text-maxlen$res.formHelp.longPwd"
        $('[lana]').each(function(){
            var $ele = $(this),
                attrs = $ele.attr('lana').split('$');
            for(var i=0,len=attrs.length; i<len; i+=2){
                $ele.attr(attrs[i], lan(attrs[i+1]));
            }
        });
        return context;
    };
    
    //-----------------------------------------------------------------------------------------------
    
    //TODO 老版本兼容性代码，新项目中去掉.
    window.lan = lan;
    
    ujs.define('lan', 'ujs.exp', function(){
        return lan;
    });
    
    $(function() {
        //auto parse lan exp when dom ready. 
        ujs.exp.lan.parse();
    });
})($, document);